package cn.elwy.rcp.ui.table.listener;

import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSourceAdapter;
import org.eclipse.swt.dnd.DragSourceEvent;

/**
 * @author huangsq
 */
public class TablePaneDragSourceListener extends DragSourceAdapter {

  private LocalSelectionTransfer transfer = LocalSelectionTransfer.getTransfer();
  private TreeViewer treeViewer;

  public TablePaneDragSourceListener(TreeViewer treeViewer) {
    this.treeViewer = treeViewer;
  }

  // 指定拖动开始的执行策略。
  @Override
  public void dragStart(DragSourceEvent event) {
    Object readOnly = treeViewer.getData("readOnly");
    if (readOnly != null && (Boolean) readOnly) {
      event.doit = false;
    }
  }

  // dragSetData方法在dragStart通过之后才被调用。这个方法可能会因为同一种传输类型多次set或
  // 不同的多种传输类型的set而被多次调用，象windows等有些平台中，dropTarget可以在鼠标移动的
  // 过程中请求数据，但是在Motif等平台中，只可以在drop操作完成之后才可以请求数据，所以在这个方
  // 法中不要假设drag and drop操作已经完成.在这个方法中是无法知道data将被drop到哪里.
  // set的Data也要符合指定的Transfer的format类型。
  @Override
  public void dragSetData(DragSourceEvent event) {
    if (transfer.isSupportedType(event.dataType)) {
      StructuredSelection selection = (StructuredSelection) treeViewer.getSelection();
      // 保存对应的库的ModuleModel，为以后打开稿件使用
      transfer.setSelection(selection);
    }
  }

  // 根据事先指定好的操作类型来处理操作结果
  @Override
  public void dragFinished(DragSourceEvent event) {
    transfer.setSelection(null);
    transfer.setSelectionSetTime(0);
    if (event.detail == DND.DROP_MOVE) {
      // TreeItem selection = DragAndDrop.this.dragTree.getSelection()[0];
      StructuredSelection selection = (StructuredSelection) treeViewer.getSelection();
      treeViewer.remove(selection);
      // selection.removeAll();
      // TODO Auto-generated method stub
      // super.dragFinished(dragsourceevent);
      // if (((DragSource) event.widget).getControl() instanceof Tree) {
      // TreeItem selection = DragAndDrop.this.dragTree.getSelection()[0];
      // }
    }
  }

}